package cn.gok.jwtdemo.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.Verification;

import java.util.Calendar;
import java.util.Map;

/**
 * @author: chen fan
 * @since: 2022/11/23 10:23
 * @description:
 */
public class JWTUtil {

    /**
     * 定义秘钥
     */
    private static final String secret = "rewrew￥%%￥￥#JKHK";


    /**
     * 生成Token
     * @param payloadInfo   要存放的信息
     * @param expireSeconds token过期时间
     * @return
     */
    public static String createToken(Map<String,String> payloadInfo, int expireSeconds){
        JWTCreator.Builder builder = JWT.create();

        //存入简单的用户信息
        for (Map.Entry<String, String> entry : payloadInfo.entrySet()) {
            builder.withClaim(entry.getKey(),entry.getValue());
        }

        //设置默认过期时间
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND,expireSeconds);
        builder.withExpiresAt(instance.getTime());

        //创建token并返回
        return builder.sign(Algorithm.HMAC256(secret));
    }

    public static String createToken(Map<String,String> payloadInfo){
        return  createToken(payloadInfo,1800);
    }

    /**
     * 对token进行校验的方法，如果没有抛出任何异常，则说明验证通过
     * @param token
     */
    public static void verify(String token){
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secret)).build();
       jwtVerifier.verify(token);
    }

    /**
     * 从解析后的token中获取数据
     * @param token： jwtToken
     * @param key     在设置withClaim时的key
     * @param alass   要获取的数据的类型
     * @param <T>
     * @return
     */
    public static<T> T getValue(String token,String key, Class<T> alass){
        DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(secret)).build().verify(token);
        return decodedJWT.getClaim(key).as(alass);
    }
}
